#include <iostream>
#include "CSqQueue.cpp"

using namespace std;

//进队第k（k>=1）个元素e
bool pushk(CSqQueue<int>& qu, int k, int e)
{
    int x;
    int n = qu.getlength();
    if(k < 1 || k > n+1)
        return false;   // 参数k错误返回false

    if(k <= n)
    {
        for(int i = 1; i <= n; i++) // 循环处理队中所有元素
        {
            if(i == k)
                qu.push(e); // 将元素e进队到第k个位置

            qu.pop(x);  // 出队元素x
            qu.push(x); // 进队元素x
        }
    }else
        qu.push(e); // k == n+1时直接进队e

    return true;
}
// 出队第k(k>=1)个元素e的算法思路：出队前k-1个元素，边出队边进队，出队第k个元素e，e不进队，将剩下的元素边出边进
bool popk(CSqQueue<int>& qu, int k, int& e)
{
    int x;
    int n = qu.getlength();
    if(k < 1 || k > n)  // 参数k错误返回false
        return false;

    for(int i = 1; i <= n; i++) // 循环处理队中所有元素
    {
        qu.pop(x);  // 出队元素x
        if(i != k)
            qu.push(x); // 将非第k个元素进队
        else
            e = x;  // 取出第k个元素，但不入队
    }
    return true;
}
int main() {
    int x;
    CSqQueue<int> qu;
    qu.push(1);
    qu.push(2);
    qu.push(3);
    qu.push(4); // [1, 2, 3, 4]
    cout << "number of elements = " << qu.getlength() << endl;  // 4
    pushk(qu, 1, 5);    // [5, 1, 2, 3, 4]
    cout << "push 1st element 5" << endl;
    popk(qu, 2, x); // [5, 2, 3, 4]
    cout << "pop 2nd element " << x << endl;
    cout <<"queue is:"<<endl;
    while(!qu.empty())  // [5, 2, 3, 4]
    {
        qu.pop(x);
        cout << x << " ";
    }
    cout << endl;
    return 0;
}
